package o2o.business.image;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import org.springframework.web.multipart.MultipartFile;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.*;

public class ImageBusiness {
	/**
	 * 图片缩放
	 * 
	 * @param originalFile
	 * @param newWidth
	 * @param quality
	 * @throws IOException
	 */
	public static void resize(File originalFile, int newWidth, float quality)
			throws IOException {
		resize(originalFile, newWidth, 0, quality, null);
	}

	/**
	 * 图片缩放
	 * 
	 * @param originalFile
	 * @param newWidth
	 * @param newHeight
	 * @param quality
	 * @throws IOException
	 */
	public static void resize(File originalFile, int newWidth, int newHeight,
			float quality) throws IOException {
		resize(originalFile, newWidth, newHeight, quality, null);
	}

	/**
	 * 图片缩放
	 * 
	 * @param originalFile
	 * @param newWidth
	 * @param newHeight
	 * @param quality
	 * @param resizedFile
	 * @throws IOException
	 */
	public static void resize(File originalFile, int newWidth, int newHeight, float quality, File resizedFile) throws IOException {
		if (quality > 1) {
			throw new IllegalArgumentException(
					"Quality has to be between 0 and 1");
		}
		// getCanonicalPath() 返回此文件的规范路径。
		ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
		Image i = ii.getImage(); // 返回此图标的 Image。
		Image resizedImage = null;

		int iWidth = i.getWidth(null);
		int iHeight = i.getHeight(null);

		// 创建图像的缩放版本
		// Image.SCALE_SMOOTH:选择图像平滑度比缩放速度具有更高优先级的图像缩放算法。
		if (newHeight > 0) {
			resizedImage = i.getScaledInstance(newWidth, newHeight,Image.SCALE_SMOOTH);
		} else {
			if (iWidth > iHeight) {
				resizedImage = i.getScaledInstance(newWidth,(newWidth * iHeight) / iWidth, Image.SCALE_SMOOTH);
			} else {
				resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight, newWidth, Image.SCALE_SMOOTH);
			}
		}

		// This code ensures that all the pixels in the image are loaded.
		Image temp = new ImageIcon(resizedImage).getImage();

		// Create the buffered image.
		BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null),
				temp.getHeight(null), BufferedImage.TYPE_INT_RGB);

		// Copy image to buffered image.
		Graphics g = bufferedImage.createGraphics();

		// Clear background and paint the image.
		g.setColor(Color.white);
		g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
		g.drawImage(temp, 0, 0, null);
		g.dispose();

		// Soften.
		float softenFactor = 0.05f;
		float[] softenArray = { 0, softenFactor, 0, softenFactor,
				1 - (softenFactor * 4), softenFactor, 0, softenFactor, 0 };
		Kernel kernel = new Kernel(3, 3, softenArray);
		ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
		bufferedImage = cOp.filter(bufferedImage, null);

		// Write the jpeg to a file.
		if (resizedFile == null) {
			resizedFile = originalFile;
		}
		FileOutputStream out = new FileOutputStream(resizedFile);

		// Encodes image as a JPEG data stream
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

		JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);

		param.setQuality(quality, true);

		encoder.setJPEGEncodeParam(param);
		encoder.encode(bufferedImage);
	} // Example usage

	/**
	 * 从本地文件读取图像的二进制流
	 * 
	 * @param infile
	 * @return
	 */
	public static FileInputStream getImageByte(String infile) {
		FileInputStream imageByte = null;
		File file = new File(infile);
		try {
			imageByte = new FileInputStream(file);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		return imageByte;
	}

	/**
	 * 将图片流读出为图片
	 * 
	 * @param inputStream
	 * @param path
	 */
	public static void readBlob(InputStream inputStream, String path,Boolean isClose) {
		try {
			FileOutputStream fileOutputStream = new FileOutputStream(path);
			byte[] buffer = new byte[1024];
			int len = 0;
			while ((len = inputStream.read(buffer)) != -1) {
				fileOutputStream.write(buffer, 0, len);
			}
			if(isClose == true || isClose == null){
				inputStream.close();
			}
			fileOutputStream.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	//图片存储--将web端接受到的图片存起来
	public synchronized static void transferToServer(MultipartFile fromFile,File toFile) throws IllegalStateException, IOException{
		fromFile.transferTo(toFile);
	}
	
	public static void main(String[] args) throws IOException {
		
	}
}
